<?php
{
    /**
     * Class Router 路由信息
     */
    class Router
    {

        #region 路由规则数组
        /**
         * @var array 路由规则数组
         */
        private $routers = array
        (
            array
            (
                "area" => "Admin",
                "name" => "default",
                "url" => "/{controller}/{action}",
                "default" => array("controller" => "Index", "action" => "Index"),
            ),
            array
            (
                "area" => "",
                "name" => "default",
                "url" => "/{controller}/{action}",
                "default" => array("controller" => "Index", "action" => "Index"),
            ),
        );
        #endregion

        #region 路由选择 Router
        /**
         * 路由选择
         * @return array 路由规则信息
         */
        public function Router()
        {
            $request_uri = $_SERVER["REQUEST_URI"];
            $request_uris = explode("?", $request_uri);
            $url = $request_uris[0]; // /Pay/With
            $url = trim($url, "/");
            $urls = array();
            if ($url != "")
            {
                $urls = explode("/", $url);
            }
            $result = null;
            foreach ($this -> routers as $val)
            {
                $result = $this -> Distribution($urls, $val);
                if ($result != null)
                {
                    break;
                }
            }
            if ($result == null)
            {
                echo '路由选择失败，对应路由不存在';
                exit;
            }

            return $result;
        }
        #endregion

        #region 匹配当前路由信息 Distribution
        /**
         * 匹配当前路由信息
         * @param array $requestUrls 当前请求信息
         * @param array $router 路由规则
         * @return array|null 反馈匹配的信息
         */
        private function Distribution($requestUrls, $router)
        {
            $routerArea = isset($router["area"]) ? $router["area"] : ""; // 域控制

            $routerDefaultController = $router["default"]["controller"]; // 默认Controller
            $routerDefaultAction = $router["default"]["action"]; // 默认Action

            $routerUrls = explode("/", trim($router["url"], "/")); // 路由Url

            $resultArea = ""; // 反馈域
            $resultController = ""; // 反馈控制器
            $resultAction = ""; // 反馈活动

            $iArea = false; // 域是否匹配过
            $iController = false; // 控制器是否匹配过
            $iAction = false; // 动作是否匹配过

            if (count($requestUrls) == 0 && $routerArea != "")
            {   // 访问信息为空，但是路由规则含有域信息
                return null;
            }

            $i = 0;
            $len = count($routerUrls);
            while ($i < $len) // 遍历路由里的规则
            {
                if ($iArea == true && $iController == true && $iAction == true)
                {   // 检测结束，跳出
                    break;
                }

                $item = $routerUrls[$i]; // 当前项

                // 域
                if ($iArea == false)
                {   // 匹配域
                    if ($routerArea != '')
                    {   // 路由包含：域信息
                        if (count($requestUrls) == 0)
                        {   // 访问Url中没有任何信息
                            return null; // 没有匹配中
                        }
                        if ($routerArea != $requestUrls[0])
                        {   // 域匹配失败
                            return null;
                        }
                        $resultArea = $requestUrls[0]; // 域匹配成功
                        array_shift($requestUrls); // 移除第一项
                    }
                    $iArea = true;
                    continue;
                }

                // 控制器
                if ($iController == false)
                {
                    if (count($requestUrls) == 0)
                    {   // 后面没有匹配项，直接使用默认值代替
                        $resultController = $routerDefaultController;
                        $resultAction = $routerDefaultAction;

                        $iController = true;
                        $iAction = true;

                        continue;
                    }

                    $resultController = $requestUrls[0];

                    if ($item != "{controller}")
                    {   // 固定控制器
                        if ($item != $resultController)
                        {
                            return null;
                        }
                    }
                    array_shift($requestUrls); // 移除第一项
                    $iController = true;
                    $i++;
                    continue;
                }

                // 活动
                if ($iAction == false)
                {
                    if (count($requestUrls) == 0)
                    {   // 后面没有匹配项，直接使用默认值代替
                        $resultAction = $routerDefaultAction;
                        $iAction = true;

                        continue;
                    }
                    $resultAction = $requestUrls[0];
                    if ($item != "{action}")
                    {   // 固定活动
                        if ($item != $resultAction)
                        {
                            return null;
                        }
                    }
                    $iAction = true;
                    $i++;
                    continue;
                }
                $i++;
            }

            $result = array
            (
                "area" => $resultArea,
                "controller" => $resultController,
                "action" => $resultAction
            );
            return $result;
        }
        #endregion
    }
}
?>